package com.szrt.java.day20170113.ch01;


import java.lang.reflect.Field;

import org.junit.Test;

/**
 * 
 * 使用反射的方式知道类里面的属性
 * 
 * 使用反射的方式知道随便传类的全路径名。
 * "com.szrt.java.day20170113.ch01.Student"
 * "com.szrt.java.day20170113.ch01.Teacher"
 * 告诉你这个类中有几个属性
 * 
 *
 */
public class FieldTest {
	
	
	
	/**
	 * new出来学生 card的默认值 0  通过反射直接访问private属性。改变这个属性的值  并把这个属性拿出来看一下。
	 * @throws Exception
	 */
	@Test
	public void set() throws Exception {
		
		Class<?> clazz =Class.forName("com.szrt.java.day20170113.ch01.Student");
		
		Object obj = clazz.newInstance();
		
		Field field =clazz.getDeclaredField("card");
		
		//打开访问权限
		field.setAccessible(true);
		
		field.set(obj, 1001001);
		
		//类似方法的调用...
		System.out.println(field.get(obj));
		
		
	}
	
	
	public static void main(String[] args) throws ClassNotFoundException {
		String leiming="com.szrt.java.day20170113.ch01.Student";
		printField(leiming);
	}
	
	
	public static void printField(String leiming) throws ClassNotFoundException{
		//1 只要是玩反射。第一步就是得到Class的一个对象。 拿到一份具体的.class文件=clazz 
		// ? 表示里面放什么东西 不能够  最好不要  写死    这样放什么类 就不知道 编译器
		Class<?> clazz =Class.forName(leiming);
		//当我打印clazz 这个东西是一个类  运行时类    
		System.out.println(clazz);
		Field[] shuxings =clazz.getDeclaredFields();
		System.out.println(shuxings.length);
		for(int index=0; index<shuxings.length;index++){
			Field field =shuxings[index];
			System.out.println(field.getName() + " : "+ field.hashCode());
		}
	}

}
